import { getDepChains } from "./getDepChain.js"
/**
 * 格式化审计结果
 * @param {*} auditResult 
 * @returns 
 */
function _normalizeVulnerabilities(auditResult) {
    // 初始化按严重程度分类的结果对象
    const result = {
        critical: [], // 严重漏洞
        high: [],     // 高危漏洞  
        moderate: [], // 中危漏洞
        low: [],      // 低危漏洞
    };

    // 遍历漏洞列表，按严重程度分类
    for (const key in auditResult.vulnerabilities) {
        const packageInfo = auditResult.vulnerabilities[key];
        const normalizedPackage = _normalizePackage(packageInfo);
        if (normalizedPackage) {
            result[packageInfo.severity].push(normalizedPackage);
        }
    }

    return result;

    function _normalizePackage(packageInfo) {
        // 1. 先找via字段是否有值，这个字段记录了漏洞，对象的才是当前包的漏洞，字符串代表是其他包影响的
        const via = packageInfo.via || [];
        const vaildVia = via.filter(item => typeof item === 'object');
        // 2. 如果没有值，说明这个包没有漏洞，直接返回null
        if (vaildVia.length === 0) {
            return null;
        }
        // 3.按格式返回并返回依赖链条
        const info = {
            name: packageInfo.name,
            severity: packageInfo.severity,
            problems: vaildVia,
            isDirect: packageInfo.isDirect,
            range: packageInfo.range,
            nodes: packageInfo.nodes || [],
        }
        info.depChains = getDepChains(packageInfo, auditResult.vulnerabilities);
        return info

    }
}


export function normalizeAuditResult(auditResult) {
    return {
        vulnerabilities: _normalizeVulnerabilities(auditResult),
        // auditReport: auditResult,
    }
}